﻿#include <iostream>
using namespace std;

//命名空间
//namespace ming
//{
//	int rand = 0;
//	void fun()//定义函数
//	{
//		printf("ming is handsome\n");
//	}
//	struct TreeNode//定义结构体 
//	{
//		struct TreeNode* left;
//		struct TreeNode* right;
//		int val;
//	};
//}
//
//int main()
//{
//	printf("%p\n", rand);
//	printf("%p\n", ming::rand);
//	ming::fun();
//	struct ming::TreeNode* Tree;
//	return 0;
//}

//// 复习C语言
//int a = 10;
//int main()
//{
//	int a = 20;// 局部优先
//	printf("%d\n", ::a);//域作用限定符号
//	return 0;// 空白表示全局域
//}

//int main()
//{
//	int i;
//	double j;
//	cin >> i >> j;
//	cout << i << endl;
//	cout << j << endl;
//	//cout << j << '\0';
//	return 0;
//}


//void fun(int a ,int b = 20 ,int c = 30)
//{
//	cout << "a = " << a << endl;
//	cout << "b = " << b << endl;
//	cout << "c = " << c << endl << endl;
//}
//int main()
//{
//	fun(1);
//	fun(1, 2);
//	fun(1, 2, 3);
//	return 0;
//}

// 缺省参数在实际中的应用
//struct Stack
//{
//	int* _a;
//	int _top;
//	int _capacity;
//};
//void StackInit(struct Stack* st, int capacity = 4)
//{
//	st->_a = (int*)malloc(sizeof(int) * capacity);
//	// ....
//}
//int main()
//{
//	struct Stack st;
//	StackInit(&st);//不知道capacity多大时，用缺省参数
//}


// 1.参数类型不同
//int fun(int a, int b)
//{
//	return a+b;
//}
//double fun(double a, double b)
//{
//	return a + b;
//}

//// 2.参数个数不同
//void fun()
//{
//	cout << "fun()" << endl;
//}
//void fun(int a)
//{
//	cout << "fun(a)" << endl;
//}

// 3.参数类型顺序不同
//void fun(int a, char b)
//{
//	cout << "fun(int a,char b)" << endl;
//}
//void fun(char b, int a)
//{
//	cout << "fun(char b,int a" << endl;
//}
//int main()
//{
//	fun(1, 'a');
//	fun('a', 1);
//	return 0;
//}


//// 交换函数中的函数重载
//void swap(int* a, int* b)
//{
//	int tmp = *a;
//	*a = *b;
//	*b = tmp;
//}
//void swap(double* a, double* b)
//{
//	double tmp = *a;
//	*a = *b;
//	*b = tmp;
//}
//int main()
//{
//	int a = 1, b = 2;
//	double c = 1.1, d = 2.2;
//	swap(&a, &b);
//	swap(&c, &d);
//	return 0;
//}

//int main()
//{
//	int a = 10;
//	double b = 2.2;
//	char c = 'c';
//	cout << a << endl;
//	cout << b << endl;
//	cout << c << endl;
//}

//// C++ 调用 C语言 的库
//extern "C"
//{
//     #include<Stack.h>
//}


// C语言 调用 C++ 的库
//#ifdef _cplusplus
//
//extern "C"
//{
//#endif // _cplusplus
//	void StackInit(ST* ps);
//	 ....
//#ifdef // _cplusplus
//}
//#endif // _cplusplus

//int main()
//{
//	int a = 10;
//	int& b;//引用在定义时必须初始化
//}


//int main()
//{
//	int a = 10;
//	int& b = a;
//	int& c = b;
//	c++;//一个变量可以有多个引用
//	return 0;
//}

//int main()
//{
//	int x = 10;
//	int b = x;
//	int& c = b;
//	++c;
//	return 0;
//}

//void Swap(int* a, int* b)
//{
//	int tmp = *a;
//	*a = *b;
//	*b = tmp;
//}
//void Swap(int& a, int& b)
//{
//	int tmp = a;
//	a = b;
//	b = tmp;
//}
//int main()
//{
//	int a = 10;
//	int b = 20;
//	Swap(a, b);
//	return 0;
//}

//int Count()
//{
//	int n = 0;
//	n++;
//	//......
//	return n;
//}
//int main()
//{
//	int ret = Count();
//	return 0;
//}

//int& Count()
//{
//	static int n = 0;
//	n++;
//	//......
//	return n;
//}
//int main()
//{
//	int& ret = Count();
//	cout << ret << endl;
//	cout << ret << endl;
//	return 0;
//}


//// 顺序表中在指定位置插入一个数据
//void SeqListInsert(SeqList* ps, int pos, SLDataType x)
//{
//	assert(pos <= ps->size && pos >= 0);
//	SeqLisrCheckCapacity(ps);
//	int end = ps->size - 1;
//	while (end >= pos)
//	{
//		ps->a[end + 1] = ps->a[end];
//		end--;
//	}
//	ps->a[pos] = x;
//	ps->size++;
//}

//int& SLAt(SL& s, int pos)
//{
//	assert(pos >= 0 && pos <= s.size);
//	return s.a[pos];
//}


//权限
//int main()
//{
//	//权限不能放大
//	const int a = 10;
//	const int& b = a;
//	return 0;
//}

//int main()
//{
//	//权限可以缩小
//	int a = 10;
//	const int& b = a;
//	return 0;
//}

//int main()
//{
//	int ii = 1;
//	double dd = ii;
//	double& rdd = ii;
//	return 0;
//}

//void func1(int n)
//{}
//void func2(const int& n)
//{}
//int main()
//{
//	int a = 10;
//	const int b = 20;
//	func1(a);
//	func1(b);
//	func1(30);
//
//	func2(a);
//	func2(b);
//	func2(30);
//	return 0;
//}
//
//typedef int SLTDataType;
//typedef struct SListNode
//{
//	SLTDataType data;
//	struct SListNode* next;
//}SLTNode;

//从开辟空间的角度上
//int main()
//{
//	//语法的角度，ra没有空间
//	int a = 10;
//	int& ra = a;
//	ra = 20;
//
//	//语法的角度，pa开了4 or 8 byte空间
//	int* pa = &a;
//	*pa = 20;
//	return 0;
//}

//#define ADD(a,b) ((a)+(b))
//int main()
//{
//	int ret = 0;
//	cout << ADD(1, 2) << endl;
//	return 0;
//}

//inline void ADD(int x, int y)
//{
//	int c = x + y;
//	printf("x+y= %d\n", c);
//}
//int main()
//{
//	int c = 1 + 2;
//	printf("x+y= %d\n", c);
//	return 0;
//}

//// auto遍历数组
//int main()
//{
//	// 旧版的遍历a数组 low
//	int a[] = { 1,2,3,4,5,6,7,8,9,10 };
//	for (int i = 0; i < sizeof(a) / sizeof(int); i++)
//	{
//		cout << a[i] << " ";
//	}
//	cout << endl;
//
//	// 运用范围for（auto关键字）自动依次取a的数据，赋值给e
//	for (auto e : a)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//	return 0;
//}

//int main()
//{
//	int a = 10;
//	auto b = &a; //int* 
//	auto* c = &a;//int*强调一定要传指针
//	auto& d = a;//int强调c是一个引用
//	cout << typeid(b).name() << endl;
//	cout << typeid(c).name() << endl;
//	cout << typeid(d).name() << endl;
//	return 0;
//}

//void f(int)
//{
//	cout << "f(int)" << endl;
//}
//void f(int*)
//{
//	cout << "f(int*)" << endl;
//}
//int main()
//{
//	f(0);
//	f(NULL);
//	f((int*)NULL);
//	f(nullptr);
//	return 0;
//}

//struct Stack
//{
//	int* a;
//	int top;
//	int capacity;
//
//	void StackInit(struct Stack* ps);
//	void StackPush(struct Stack* ps);
//	void StackPop(struct Stack* ps);
//};
//
//int main()
//{
//	Stack st1;
//	Stack st2;
//	
//	st1.StackInit();
//	st1.StackPush(1);
//	st1.StackPush(2);
//    st1.StackPush(3);
//	return 0;
//}


// C语言
//typedef struct ListNode_C
//{
//	struct ListNode_C* next;
//	int val;
//};
//
//// C++
//struct ListNode_CPP
//{
//	ListNode_CPP* next;
//	int val;
//};


// 类的实例化
//class Person
//{
//public:
//	void personfunc();
//private:
//	char* _name;
//	int _age;
//	int _weight;
//};
//int main()
//{
//	Person p1;//类的实例化
//	Person p2;
//	Person p3;
//}


//class Date
//{
//public:
//	void Init(int year, int month, int day)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//	void Print()
//	{
//		cout << _year << "-" << _month << "-" << _day << endl;
//	}
//private:
//	int _year;     // 年
//	int _month;    // 月
//	int _day;      // 日
//};
//int main()
//{
//	Date d1, d2;
//	d1.Init(2022, 1, 11);
//	d2.Init(2022, 1, 12);
//	d1.Print();
//	d2.Print();
//	return 0;
//}

//class A
//{
//	public:
//		void Print()
//		{
//			cout << this << endl;
//			cout << "Print()" << endl;
//		}
//private:
//	int _a;
//};
//int main()
//{
//	A* p = nullptr;
//	p->Print();
//	return 0;
//}

//class A
//{
//public:
//	void PrintA()
//	{
//		cout << _a << endl;
//	}
//private:
//	int _a;
//};
//int main()
//{
//	A* p = nullptr;dad
//	p->PrintA();
//	return 0;
//}


//class Data
//{};
//int main()
//{
//	Data d1;//调用存在歧义/二义性
//	Data d2(2022, 7, 23);
//}

//
//class Date
//{
//public:
//	void print()
//	{
//		cout << _year << "-" << _month << "-" << _day << endl;
//	}
//private:
//	int _year = 1;
//	int _month = 1;
//	int _day = 1;
//};
//int main()
//{
//	Date d1(2022, 12, 22);
//	Date d2(2023, 11, 22);
//	return 0;
//}2


//int main()
//{
//	cout << " hello world " << endl;
//	return 0;
//	int a = 10;
//	cout << a << endl;1
//}

//class Date
//{
//public:
//	Date(int year = 1, int month = 1, int day = 1)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//
//	// 不需要写，默认生成就够用，但是默认生成的也没做什么事
//	//~Date()
//	//{
//	//	// ~Date()没有什么需要清理
//	//	cout << "~Date()" << endl;
//	//}
//private:
//	int _year = 1;
//	int _month = 1;
//	int _day = 1;
//};


//class Stack()
//{
//public:
//	void push();
//	void pop();
//	// ......
//
//	// 手动显示写，手动释放资源
//	~Stack()
//	{
//		cout << "~Stack()" << endl;
//		free(_array);
//		_capacity = _size = 0;
//		_array = nullptr;
//	}
//private:
//	int* _array;
//	int _capacity;
//	int _top;
//}


// 拷贝构造函数
class Date
{
public:
	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	Date(Date d)
	{
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}
private:
	int _year;
	int _month;
	int _day;
}
void get1(Date d)
{}
void get2(Date& d)
{}
int main()
{
	Date d1(2022, 5, 20);
	get1(d1);
	get2(d1);
	return 0;2
}